Skip to content

引入基于 AK/SK -> App -> tenantId 的 OpenAPI 租户识别链路,补齐 remote 模式下的无登录态租户隔离#21

Merged
itxaiohanglover merged 1 commit intoitxaiohanglover:mainfrom
Mrjlv1:main
Mar 7, 2026
Merged

引入基于 AK/SK -> App -> tenantId 的 OpenAPI 租户识别链路,补齐 remote 模式下的无登录态租户隔离#21
itxaiohanglover merged 1 commit intoitxaiohanglover:mainfrom
Mrjlv1:main

Conversation

@Mrjlv1
Copy link
Copy Markdown
Contributor

@Mrjlv1 Mrjlv1 commented Mar 7, 2026

PR 类型

  • 🐛 Bug 修复
  • ✨ 新功能
  • 📝 文档更新
  • 🎨 代码优化/重构
  • ⚡ 性能优化
  • ✅ 测试相关
  • 🔧 配置/构建相关
  • 🌐 国际化/本地化
  • 其他

变更说明

本次改动主要围绕 MCP Remote 模式下的模板搜索、上传、删除链路,补齐基于 OpenAPI AK/SK 的租户识别与 ES 租户隔离能力,并重构 ES 索引模型,提升检索准确性与可维护性。

1. 租户识别与上下文传递闭环

  • OpenAPI 验签成功后,基于 accessKey -> sys_app -> tenantId 建立 ApiTenantContextHolder
  • 新增 SearchTenantUtils,统一 search / upload / delete 的租户解析逻辑
  • search 链路通过 SearchRequest.tenantId 显式透传租户,解决异步检索线程无法读取 ThreadLocal 的问题
  • 在请求完成阶段统一清理 ApiTenantContextHolder,与现有 UserContextHolder 生命周期保持一致

2. App 与文件模型补齐租户字段

  • AppDO 改为继承 TenantBaseDO,使 OpenAPI 应用具备租户归属能力
  • AppReq 增加隐藏字段 tenantId
  • 创建 App 时,自动从当前用户上下文写入租户信息
  • FileDO 改为继承 TenantBaseDO,确保上传后的 sys_file 记录具备租户归属

3. ES 存储模型重构

  • 将 ES 从“模板全文拼接索引”重构为“基于 meta.json 的模板级元数据索引”
  • 不再将整份模板源码拼接写入单个 content 字段
  • 当前索引文档字段主要包括:
    • id
    • tenantId
    • groupId
    • artifactId
    • version
    • title
    • name
    • description
    • summary
    • tags
    • keywords
    • fileCount
    • createTime
  • 文档 ID 调整为:tenantId:groupId:artifactId:version

4. ES 搜索方式优化

  • 搜索改为模板元数据检索,不再依赖大文本全文内容
  • 当前主要检索字段:
    • name^4
    • artifactId.text^3
    • description^3
    • summary^2
    • tags.text^3
  • 所有搜索请求强制附带 tenantId filter,实现租户级隔离
  • 高亮和 snippet 优先使用 description/summary

5. upload / delete 幂等性增强

  • 为模板上传与删除增加 RedisLockUtils 分布式锁
  • upload 使用 lock:template:upload:{groupId}:{artifactId}:{version}
  • delete 使用 lock:template:delete:{groupId}:{artifactId}:{version}
  • overwrite 场景下,先删除旧文件与旧 ES 文档,再重建索引,避免残留脏数据

6. TemplateFileController 与服务链路整理

  • 恢复 delete 接口删除结果返回结构
  • controller 不再承担上下文清理职责
  • upload / delete / index 全部统一走租户解析工具类

7. MCP 侧上传路径校验修正

  • upload --path 恢复为严格校验,只接受 groupId/artifactId/version
  • 不再接受自动截取最后三段的宽松路径
  • 当用户误传 codestyle-cache/... 时,给出更明确的错误提示

相关 Issue

测试

  • 本地测试通过
  • 添加/更新了单元测试
  • 文档已更新

已执行验证

  • 重新编译后端相关模块:
    • mvn -pl codestyle-plugin/codestyle-plugin-search,codestyle-server -am -DskipTests compile
  • 重新编译 MCP 模块:
    • mvn -DskipTests compile
  • 清空并重建 ES 索引 codestyle_templates
  • 使用新 mapping 验证索引创建成功
  • 验证 OpenAPI 搜索链路中的 tenantId 传递日志
  • 验证模板上传 ES 写入链路修复 LocalDateTime 序列化异常

截图/日志

关键验证点

  • OpenAPI 验签开始: accessKey=..., dbTenantId=...
  • OpenAPI 验签完成并写入 ApiTenantContextHolder: ...
  • OpenAPI 搜索请求写入 tenantId: ...
  • ES 检索请求已构建: index=codestyle_templates, tenantFilter=...
  • ES 索引模板: index=..., docId=tenantId:groupId:artifactId:version

检查清单

  • 代码遵循项目的代码规范
  • 已自测所有改动
  • 已更新相关文档
  • 提交信息清晰明确
  • PR 标题简洁明了

其他信息

索引迁移说明

本次 PR 调整了 codestyle_templates 的 ES 文档结构与查询字段,合并前建议:

  1. 删除旧索引
  2. 按新 mapping 重建索引
  3. 重新上传模板以生成新的模板级文档

注意事项

当前工作区仍存在部分与本次 PR 无关的前端/其他模块改动,提交 PR 时建议仅纳入本次 OpenAPI + Search + MCP 相关文件。

- 将 search/upload/delete 的租户解析统一收口到 SearchTenantUtils
- 将 ES 从“模板全文拼接索引”重构为“基于 meta.json 的模板级元数据索引”
- 为模板上传/删除增加 Redis 分布式锁,确保 ES 与文件存储更新具备幂等性
- 统一在请求完成阶段清理 ApiTenantContextHolder,避免 ThreadLocal 污染
@itxaiohanglover itxaiohanglover merged commit 8ac94c1 into itxaiohanglover:main Mar 7, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants